import {
	toast
} from '@/uni_modules/uview-plus'
import CryptoJS from "crypto-js";
// import store from '@/store'
// import App from '@/App'
// import {
// 	createSSRApp
// } from 'vue'
// const app = createSSRApp(App)

// import { getCurrentInstance, onMounted} from 'vue'
// const { proxy } = getCurrentInstance();
let key = CryptoJS.enc.Utf8.parse('3zKzyf6eEfuDjAG3');
let iv = CryptoJS.enc.Utf8.parse('fyUANZ0qSNZhhNCV');

//解密方法
const Decrypt = (str) => {
	// str = (str + '').replace(/\n*$/g, '').replace(/\n/g, '');
	const nContent = CryptoJS.AES.decrypt(str, key, {
		iv: iv,
		mode: CryptoJS.mode.CBC,
		padding: CryptoJS.pad.ZeroPadding
	})
	const newdata = CryptoJS.enc.Utf8.stringify(nContent)
	return newdata;
}

const requestInterceptors = (http) => {
	const systeminfo = uni.getSystemInfoSync()

	console.log('systemInfosync', systeminfo)
	/**
	 * 请求拦截
	 * @param {Object} http
	 */
	http.interceptors.request.use((config) => { // 可使用async await 做异步操作
			// 初始化请求拦截器时，会执行此方法，此时data为undefined，赋予默认{}
			// config.data = config.data || {}
			// console.log(11,app.config)
			try {
				if (
					config.url.toLowerCase().indexOf("/analysis/") === 0 ||
					config.url.toLowerCase().indexOf("analysis/") === 0
				) {
					config.baseURL = "https://analysis.bidcenter.com.cn";
				}
			} catch (e) {}
			config.data = Object.assign({}, {
				// 时间戳
				guid: systeminfo.deviceId,
				// app.config.globalProperties.currUser.token,
				token: uni.getStorageSync("curruser").token,
				// 4040--微信站  7670微信小程序站
				from: '4038',
				/**
				 * 后期所有接口都需要在内网中添加位置，用于日志查询
				 * 
				 * 添加方法：
				 * 内网 - 系统 - 分类管理 - 外网操作日志管理 - 微信站 - 选中点击右键（增加节点，根据接口功能输入名称，然后右则自动生成一个关于 location的数字，location的值配置这个数字即可
				 * 6757--我的会员
				 */
				location: '8089',
				// 不同于其它项目，以下是app专有参数
				system: systeminfo.platform,
				cid: uni.getStorageSync("cid"),
				// 如：5.3.0
				version: uni.getStorageSync("ver"),
				// 5300 注：需要用自定义基座进行测试，标准基座不准
				ver:systeminfo.appVersionCode
			}, config.data) || {}
			// console.log(store.state);
			// console.log(config)
			return config
		}, (config) => // 可使用async await 做异步操作
		Promise.reject(config))
}
const responseInterceptors = (http) => {
	/**
	 * 响应拦截
	 * @param {Object} http 
	 */
	// http.interceptors.response.use((response) => { /* 对响应成功做点什么 可使用async await 做异步操作*/
	// 	const data = response.data
	// 	// console.log('http', data)
	// 	// 自定义参数
	// 	const custom = response.config?.custom
	// 	if (data.code !== 200) { // 服务端返回的状态码不等于200，则reject()
	// 		// 如果没有显式定义custom的toast参数为false的话，默认对报错进行toast弹出提示
	// 		if (custom.toast !== false) {
	// 			toast(data.message)
	// 		}
	// 		// 如果需要catch返回，则进行reject
	// 		if (custom?.catch) {
	// 			return Promise.reject(data)
	// 		} else {
	// 			// 否则返回一个pending中的promise
	// 			return new Promise(() => { })
	// 		}
	// 	}
	// 	return data.data || {}
	// }, (response) => { /*  对响应错误做点什么 （statusCode !== 200）*/
	// 	return Promise.reject(response)
	// })

	http.interceptors.response.use((response) => {
		/* 对响应成功做点什么 可使用async await 做异步操作*/
		/**
			response:
			config: {baseURL: 'https://interface.bidcenter.com.cn', method: 'POST', url: 'wechat/GetSearchListHandler.ashx', params: {…}, custom: {…}, …}
			data: {"ret":false,"msg":"access_token已过期","retbs":1,"other":"","other2":{}}, statusCode:'200'}
			errMsg: "request:ok"
			header: {cache-control: 'private', content-type: 'text/plain; charset=utf-8'}
			statusCode: 200
			response.data:
			{"ret":true,"msg":"","retbs":0,"other":"","other2":{}}
		 */
		const data = typeof(response.data) === 'string' ? JSON.parse(Decrypt(response.data)) : response.data
		// 自定义参数 
		const custom = response.config?.custom;
		// 只有电脑端才给此提示
		// #ifdef H5
		console.log(response.config.url)
		console.log(data)
		// #endif

		// getApp().reload() 
		// if (data.code !== 200) 规则按项目中规则来！！！！
		if (!data.ret) {
			// 服务端返回的状态码不等于0，则reject()
			/**
			 * 如果没有显式定义custom的toast参数为false的话，默认对报错进行toast弹出提示
			 * 配置：
			 * custom: {
				catch: true,
				toast: false,
				}, 
			 */
			if (custom.toast !== false) {
				// uni.$u.toast(data.msg)
				console.log(data.msg)
			}
			// 如果需要catch返回，则进行reject
			// 微信权限接口异常，不给提示	
			if (custom?.catch) {

				/**
				 * retbs:400 guid过期，清除 guid，并重新加载页面!!!!注:和姚宇辉确认小程序没有400
				 * 
				 * rets:-1 未登录（未绑定）,token为空
				 * rets:-100:给token了，但token无效，此时需要清空重新获取token
				 * rets:101 从另一端已绑定/解绑
				 * rets:102 当从另一端已绑定/解绑，
				 * 
				 * 	注：修改密码后，需要清楚cookie重新调权限接口获取最新的token，否则会返回-1
				 * rets:0:时，other2.errcode会有40029，40163这两个码
				 * 		40029	无效的 oauth_code
						40163	oauth_code已使用
				 * 
				 */

				// 两端同时登陆/解绑，一端解绑/绑定时到另一端时，另一端需要刷新
				// 两端同时登录/解绑，一端解绑，另一非 解绑/绑定页（如：详情页）接口会返回 -102
				// if (data.retbs === -100 || data.retbs === 101 || data.retbs === -102 || data.retbs === -1) {
				// 	uni.removeStorageSync('uni_local_data');
				// 	const currenturl = '/pages/home/home'
				// 	 getApp().reload('/pagesOne/login/login?callback=' + encodeURIComponent(currenturl))
				// 	// const currenturl = '/pages/home'
				// 	// uni.navigateTo({
				// 	// 	url: '/pagesOne/login/login?callback=' + encodeURIComponent(currenturl),
				// 	// })
				// }

				if (data.retbs !== 1) {
					// 等同于 new Promise((resolve, reject) => reject('出错了'))
					return Promise.reject(data)
				} else {
					return new Promise(() => {})
				}
			} else {
				// 否则返回一个pending中的promise
				return new Promise(() => {})
			}

		} else {
			// 此项目中统一用的 other2代替data，故把 data改成other2!!!!
			const newData = data.other2 || {};
			// 扩展接口将data_extent放在other2中
			// data_extent 接口除other2外的返回值
			if (newData && !newData.length && typeof newData !== "string") {
				newData["data_extent"] = {};
				for (var key in data) {
					if (key != "other2") {
						newData["data_extent"][key] = data[key];
					}
				}
			}
			return newData
		}
	}, (error) => {
		/*  对响应错误做点什么 （statusCode !== 200）*/
		console.log(error)
		const data = {
			msg: error.statusCode + '：服务器异常'
		}

		// 500 时给错误提示
		return Promise.reject(data)
		// 不提示toast且中止Promise
		// return new Promise(() => {})
		// if (!infiniteLoop()) return;
	})


}


export {
	requestInterceptors,
	responseInterceptors
}